package com.zx.idc.backend.gui.api.commom.factory;

import com.zx.idc.backend.gui.api.commom.factory.digest.*;

import java.util.HashMap;

/**
 * 签名服务类
 *
 */
public class HashProvider {
    private static final HashMap<Integer, Digest> ENCRYPT_HASH_MAP;

    static {
        ENCRYPT_HASH_MAP = new HashMap<>();
        ENCRYPT_HASH_MAP.put(0, new NoneDigest());
        ENCRYPT_HASH_MAP.put(1, new MD5DigestImpl());
        ENCRYPT_HASH_MAP.put(2, new SHA1DigestImpl());
    }

    /**
     * 验证外部传入字符串签名是否正确
     * @param hashAlgorithm 签名算法
     * @param text 被签名字符串
     * @param digestValue 外部传入签名值
     * @param digestPassword 签名密码
     * @return 验证结果，true：正确，false：错误
     */
    public static boolean verifyByBase64(int hashAlgorithm, String text, String digestValue, String digestPassword) {
        //根据传入的密钥进行验证
        String md5Text = hashByBase64(hashAlgorithm, text, digestPassword);
        if (md5Text.equalsIgnoreCase(digestValue)) {
            return true;
        }
        return false;
    }

    /**
     * 验证外部传入字符串签名是否正确（无需密码）
     * @param hashAlgorithm 签名算法
     * @param text 被签名字符串
     * @param digestValue 外部传入签名值
     * @return 验证结果，true：正确，false：错误
     */
    public static boolean verifyByBase64WithoutPassword(int hashAlgorithm, String text, String digestValue) {
        //根据传入的密钥进行验证
        String md5Text = hashByBase64(hashAlgorithm, text);
        if (md5Text.equalsIgnoreCase(digestValue)) {
            return true;
        }
        return false;
    }

    /**
     * 验证外部传入字符串签名是否正确
     * @param hashAlgorithm 签名算法
     * @param bytes 被签名字节数组
     * @param digestValue 外部传入签名值
     * @param digestPassword 签名密码
     * @return 验证结果，true：正确，false：错误
     */
    public static boolean verifyByBase64(int hashAlgorithm, byte[] bytes, String digestValue, String digestPassword) {
        //根据传入的密钥进行验证
        String md5Text = hashByBase64(hashAlgorithm, bytes, digestPassword);
        if (md5Text.equalsIgnoreCase(digestValue)) {
            return true;
        }
        return false;
    }

    /**
     * 验证外部传入字符串签名是否正确（无需密码）
     * @param hashAlgorithm 签名算法
     * @param bytes 被签名字节数组
     * @param digestValue 外部传入签名值
     * @return 验证结果，true：正确，false：错误
     */
    public static boolean verifyByBase64WithoutPassword(int hashAlgorithm, byte[] bytes, String digestValue) {
        //根据传入的密钥进行验证
        String md5Text = hashByBase64(hashAlgorithm, bytes);
        if (md5Text.equalsIgnoreCase(digestValue)) {
            return true;
        }
        return false;
    }

    /**
     * 计算字符串的签名
     * @param hashAlgorithm 签名算法
     * @param text 被签名字符串
     * @param key 签名密码
     * @return 签名值
     */
    public static String hashByBase64(int hashAlgorithm, String text, String key) {
        return ENCRYPT_HASH_MAP.get(hashAlgorithm).digest(text, key, true);
    }

    /**
     * 计算字节数组的签名
     * @param hashAlgorithm 签名算法
     * @param bytes 被签名字节数组
     * @param key 签名密码
     * @return 签名值
     */
    public static String hashByBase64(int hashAlgorithm, byte[] bytes, String key) {
        return ENCRYPT_HASH_MAP.get(hashAlgorithm).digest(bytes, key, true);
    }

    /**
     * 计算字符串的签名 （无需密码）
     * @param hashAlgorithm 签名算法
     * @param text 被签名字符串
     * @return  签名值
     */
    public static String hashByBase64(int hashAlgorithm, String text) {
        return ENCRYPT_HASH_MAP.get(hashAlgorithm).digestWithoutPassword(text, true);
    }

    /**
     * 计算字节数组的签名 （无需密码）
     * @param hashAlgorithm 签名算法
     * @param bytes 被签名字节数组
     * @return 签名值
     */
    public static String hashByBase64(int hashAlgorithm, byte[] bytes) {
        return ENCRYPT_HASH_MAP.get(hashAlgorithm).digestWithoutPassword(bytes, true);
    }


}
